home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
program
/
561
/
prolog
/
document.doc
(
.txt
)
< prev
next >
Wrap
ST Writer Document
|
1991-09-08
|
74KB
|
1,991 lines
Do Run Run STWRITER.PRG
TOY Prolog ST
Dokumentation f
r Version 3
Inhalt
I. Urheberrechte
II. Syntax und Benutzerschnittstelle
III. Systemfunktionen und vordefinierte Pr
dikate
IV. Die Hilfsprogramme
V. Die Demonstrationsprogramme
Anhang
A.1 Aufbau des Interpreters
A.2 Syntax des inneren Interpreters
A.3 Die Systemdatei
A.4 Die Implementierung der Benutzerschnittstelle
A.5 Unterschiede der vorliegenden Version zur Dokumentation
I. Urheberrechte
Das Programm basiert auf einer Implementierung von Prolog, die von
Feliks Kluzniak und Stanislaw Szpakowicz in ihrem Buch "Prolog for
Programmers" (Academic Press, London, 1985) ver
ffentlicht wurde.
Die Rechte f
r die ATARI-Version liegen bei Jens Kilian, Bensheim.
Das Programm ist unter der Bedingung, da
keiner der Hinweise auf
die bestehenden Urheberrechte aus den verschiedenen Dateien
entfernt oder ver
ndert wird, freigegeben zur
ffentlichen
Verbreitung, jedoch darf es nicht gewinnbringend verkauft werden.
ATARI, 520 ST und TOS sind Warenzeichen der ATARI Corp.
GEM ist Warenzeichen von Digital Research, Inc.
II. Syntax und Benutzerschnittstelle
Der verwendete Dialekt
hnelt stark dem in "Programming in Prolog"
(Clocksin/Mellish, Springer-Verlag, Berlin und Heidelberg 1981)
verwendeten Dialekt Prolog-10. Einige der Unterschiede werden
weiter unten mit angegeben.
II.1 Syntax von TOY Prolog
Die verwendete Notation ist BNF, wobei die nicht-terminalen
Symbole fett dargestellt sind; einige davon sind mit Indizes
versehen. Der Konstrukt { s } bedeutet, da
die Symbolfolge s
beliebig oft (auch 0 mal) wiederholt werden kann.
Um Verwechselungen vorzubeugen, sind die terminalen Symbole {, |,
} ebenfalls fett dargestellt.
Es wird angenommen, da
die normalen Operatorvereinbarungen in
Kraft sind.
Kommentare sind durch *** angegeben.
Klausel ::= Definition | Grammatische_Regel | Direktive
Definition ::= Regel | Fakt
Regel ::= Kopf :- Rumpf
Fakt ::= Kopf
*** Der
erste Funktor von Kopf ist nicht :- / 2
Kopf ::= Funktor_Term
Rumpf ::= Rumpf_Alternative { ; Rumpf_Alternative }
Rumpf_Alternative ::= Aufruf { , Aufruf }
Aufruf ::= Funktor_Term | Variable | ( Rumpf )
Funktor_Term ::= Term
*** Keine Variable und kein Integer; eine formale Definition
*** w
re ziemlich aufwendig
Grammatische_Regel ::= Linke_Seite --> Rechte_Seite
Linke_Seite ::= Nicht_terminal Kontext | Nicht_terminal
Nicht_terminal ::= Funktor_Term
Kontext ::= terminale_Symbole
Rechte_Seite ::= Alternativen
Alternativen ::= Alternative { ; Alternative }
Alternative ::= Regel_Element { , Regel_Element }
Regel_Element ::= Nicht_terminal | terminale_Symbole |
Bedingung | ! | ( Alternativen )
terminale_Symbole ::= Liste | Zeichenkette
*** Nur 'geschlossene' Listen sind erlaubt
Bedingung ::= Klammer_Term
Direktive ::= Kommando | Anfrage
Kommando ::= :- Rumpf
Anfrage ::= Rumpf
*** Der
erste Funktor von Rumpf ist nicht :- / 1
Term ::= Term1200
TermN ::= Opfx,N TermN-1 | Opfy,N TermN |
TermN-1 Opxf,N | TermN Opyf,N |
TermN-1 Opxfx,N TermN-1 |
TermN-1 Opxfy,N TermN |
TermN Opyfx,N TermN-1 |
TermN Opyfy,N TermN | TermN-1
*** 1
1200; OpTyp,N ist ein Operator mit Typ 'Typ' und
*** Priorit
t N; TermN kann man 'Term mit Priorit
t N' nennen.
Term0 ::= Variable | Integer | Zeichenkette |
Liste | Nicht_Operator |
Nicht_Operator ( Term { , Term } ) |
( Term ) | Klammer_Term
Klammer_Term ::= { Term }
Nicht_Operator ::= Funktor
OpT,N ::= Funktor
*** T
{ fx, fy, xf, yf, xfx, xfy, yfx, yfy }, 1
1200
*** siehe auch Bemerkung 1
Liste ::= [] | [ Term999 { , Term999 } ] |
[ Term999 { , Term999 } | Term ]
*** Terme mit Priorit
t 999 k
nnen ohne Klammern mit Kommas
*** verbunden werden ( , / 2 hat Priorit
t 1000)
Funktor ::= Wort | Q_Name | Symbol | Einzelzeichen
Wort ::= Wortanfang { Alphanum }
Wortanfang ::= Kleinbuchstabe
Alphanum ::= Kleinbuchstabe | Gro
buchstabe |
Ziffer | _
Q_Name ::= ' { Q_Zeichen } '
Q_Zeichen ::= '' | Nicht_'
*** Nicht_' ist ein beliebiges Zeichen au
Symbol ::= Symbolzeichen { Symbolzeichen }
Variable ::= Variablenanfang { Alphanum }
Variablenanfang ::= Gro
buchstabe | _
Integer ::= - Ziffer { Ziffer } | Ziffer { Ziffer }
Zeichenkette ::= " { S_Zeichen } "
*** In TOY bedeutet eine Zeichenkette eine Liste aus den Namen
*** der Zeichen, in Prolog-10 eine Liste ihrer ASCII-Codes
S_Zeichen ::= "" | Nicht_"
*** Nicht_" ist ein beliebiges Zeichen au
Kleinbuchstabe ::= a | b | c | d | e | f | g | h | i |
j | k | l | m | n | o | p | q | r |
s | t | u | v | w | x | y | z |
buchstabe ::= A | B | C | D | E | F | G | H | I |
J | K | L | M | N | O | P | Q | R |
S | T | U | V | W | X | Y | Z |
Ziffer ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Symbolzeichen ::= # | $ | & | * | + | - | . | / | : |
< | = | > | ? | @ | \ | ^ | ` | ~ |
*** Ein einzelner Punkt, gefolgt von Leerraum,
*** ist kein Symbolzeichen, sondern ein Ende_Punkt.
Einzelzeichen ::= , | ; | !
Zeichengruppe ::= Funktor | Variable | Integer |
Zeichenkette | Klammer_oder_Strich
*** Zeichengruppen werden in Bemerkung 6 verwendet, s.u.
Klammer_oder_Strich ::= ( | ) | [ | ] | { | } | |
Kommentar ::= % { Nicht_Zeilenende } Zeilenende
*** Zeilenende ist ein Zeichen, das das Ende einer Zeile angibt,
*** Nicht_Zeilenende ist ein beliebiges anderes Zeichen.
*** TOY Prolog wandelt alle Zeilenenden in einzelne CR-Zeichen um.
Leerraum ::= { Kontrollzeichen }
*** Kontrollzeichen ist 'SPACE' oder 'TAB' oder Zeilenende oder
*** ein beliebiges nichtdruckbares Zeichen (ASCII-Code < 32).
Ende_Punkt ::= . Kontrollzeichen
Bemerkungen:
(1) Gemischte Operatoren wurden nicht in die Beschreibung mit
aufgenommen, aber die Regeln daf
r haben alle dieselbe Form
wie z.B.
TermN ::= Op[xfy,fx],N TermN-1
(es gibt noch 11 weitere Regeln f
r gemischte Operatoren).
In TOY Prolog kann ein gemischter Operator h
chstens einen
un
ren und einen bin
ren Typ besitzen, beide mit derselben
Priorit
(2) Es gibt viele mehrdeutige Kombinationen von zusammenh
ngenden
Operatoren, die nicht von dieser Beschreibung erfa
t werden.
(3) Nicht alle Funktoren (z.B. Namen in Apostrophen) k
nnen als
Operatoren vereinbart werden.
(4) In der Beschreibung von Rumpf h
tte man die gesonderte
Betrachtung von , / 2 und ; / 2 weglassen k
nnen, da beide
normalerweise als Infix-Operatoren vereinbart sind. Die Regel
Rumpf ::= Funktor_Term
h
tte aber die im Regelfall auftretende Struktur eines
Rumpfes verschleiert.
(5) Die Syntax f
r Direktiven (Kommandos und Anfragen) orientiert
sich an der in TOY Prolog verwendeten Benutzerschnittstelle.
(6) Kommentare und Leerraum k
nnen beliebig vor und hinter
Zeichengruppen eingesetzt werden, nicht jedoch im Innern
einer Zeichengruppe. Ein Kommentar erstreckt sich nur bis zum
n
chsten Zeilenende.
(7) Zwischen einem Minuszeichen, das als Funktor behandelt werden
soll, und einer vorzeichenlosen Integerzahl mu
ein Leerraum
stehen. Ein Minuszeichen direkt vor einer Ziffernfolge wird
als Vorzeichen betrachtet.
(8) Ein eingegebener Term mu
mit einem Ende_Punkt (au
erhalb
eines apostrophiertens Namens, einer Zeichenkette oder eines
Kommentares) abgeschlossen werden
(9) TOY Prolog benutzt einen einfachen Unifikationsalgorithmus
ohne 'occurrence check'. Daher k
nnen z.B. die Terme
X und f(X)
unifiziert werden. Dabei entstehen zyklische Datenstrukturen,
die bei unvorsichtiger Programmierung den Interpreter bei der
Ausgabe oder der Unifikation in eine Endlosschleife f
hren
k
nnen. Bei solchen Strukturen ist daher Vorsicht geboten.
II.2 Die Benutzerschnittstelle
Die Benutzerschnittstelle von TOY Prolog ist in Prolog selbst
geschrieben. Dabei wurde ein Zwischencode verwendet, der nur
leichte Einschr
nkungen gegen
ber der vollst
ndigen Syntax
aufweist, der aber leicht in den vom inneren Interpreter benutzten
Code
bersetzt werden kann. N
heres dazu im Anhang.
Der innere Interpreter ruft das Pr
dikat ear / 0 auf, sobald er
vom Benutzer-Eingabestrom 'user' lesen soll.
Dieses Pr
dikat ruft die Hauptschleife des
eren Interpreters
auf; ihr Name ist loop / 0.
In der Schleife wird der Benutzer durch den Prompt
aufgefordert, einen Term einzugeben, der danach auf folgende Weise
ausgef
hrt wird :
(1) Variablen oder fehlerhafte Terme werden ignoriert.
(2) Zahlen erzeugen eine Fehlermeldung.
(3) Terme der Form "Kopf :- Rumpf" oder "Links --> Rechts" werden
als Regeln in die Datenbank
bernommen (grammatische Regeln
mit '-->' werden vorher
bersetzt).
(4) Terme der Form ":- Rumpf" werden als Kommandos angesehen und
deterministisch ausgef
(5) Eine Liste wird als Liste von Dateinamen betrachtet. Zur
Auswertung der Liste wird das Pr
dikat 'consultall'
aufgerufen.
(6) Alle anderen Terme werden als Anfragen behandelt : es wird
versucht, das beschriebene Ziel zu erf
llen. Gelingt das, so
werden die resultierenden Variableninstantiierungen
ausgegeben, und der Interpreter wartet auf die Eingabe eines
Zeichens. Ist es das Zeichen ';', so wird versucht, die
Anfrage neu zu erf
llen.
Enth
lt die Anfrage keine Variablen, so wird bei Gelingen
'yes' ausgegeben.
Schl
gt die Anfrage fehl, so wird 'no' ausgegeben.
Durch Aufruf des Pr
dikats 'stop' wird das Programm abgebrochen.
III. Systemfunktionen und vordefinierte Pr
dikate
III.1 Allgemeines
Systemfunktionen sind Funktionen, die im eigentlichen (inneren)
Interpreter implementiert sind, vordefinierte Pr
dikate sind in
Prolog geschrieben und werden nach dem Start des Interpreters aus
der Systemdatei 'SYSFILE.TOY' gelesen (siehe dazu den Anhang).
Die grundlegenden Funktionen von Prolog-10 werden durch diese
beiden Gruppen abgedeckt. In der ATARI-Version wurden viele
tzliche Systemfunktionen implementiert, die den Zugriff auf
spezielle Eigenschaften des ST (GEM - Grafikroutinen und
Echtzeituhr) erm
glichen.
Eine Systemfunktion kann drei verschiedene Ergebnisse produzieren:
sie kann fehlschlagen, erf
llt werden, oder einen Systemfehler
produzieren. Wird eine Systemfunktion erf
llt, so treten
blicherweise Nebeneffekte auf (z.B. Ausgabefunktionen).
Ein auftretender Fehler kann zur Folge haben, da
der Versuch, das
aktuelle Ziel zu erf
llen, vollst
ndig abgebrochen wird; es kann
sogar (bei Speicher
berlauf) zum Abbruch des Interpreters kommen.
Ein derart schwerwiegender Fehler wird durch die Meldung
"Fatal error : ..." angezeigt. Nach einem solchen Fehler startet
der Interpreter selbst
ndig das Pr
dikat ear / 0, falls nicht
gerade eine Datei eingelesen wird. Im Falle von Fehlern beim
ffnen oder Schlie
en von Dateien werden vorher Eingabe und
Ausgabe wieder auf Tastatur bzw. Bildschirm umgeleitet.
Im Normalfall wird ein Fehler jedoch durch andere Umst
verursacht, z.B. durch fehlerhafte Parameter beim Aufruf einer
Systemfunktion. In diesem Fall wird die Erf
llung des aktuellen
Zieles nicht abgebrochen; es wird fortgefahren, als ob der den
Fehler verursachende Term ein Aufruf des Pr
dikats error / 1 ist.
Das Argument von error(...) ist dabei der fehlerhafte Aufruf
selbst. error / 1 ist in Prolog geschrieben und befindet sich in
der Systemdatei; der Benutzer kann eigene Fehlerroutinen
schreiben. error(...) kann auch explizit aufgerufen werden. In der
vorliegenden Version gibt error(Call) eine Meldung der Form
"System call error : Call" aus, wenn der
erste Funktor von Call
eine Systemfunktion bezeichnet, andernfalls einfach
"Error : Call". Nach der Ausgabe schl
gt error / 1 fehl.
III.2 Beschreibung der Systemfunktionen und vordefinierten
Pr
dikate
Bemerkung: In den folgenden Beschreibungen werden Aussagen wie
"ein Pr
dikat versucht, zwei Terme zu unifizieren"
gemacht, wenn das Pr
dikat je nach dem Ergebnis der
Unifikation fehlschl
gt oder erf
llt wird. Nach der
Erf
llung sind die Terme unifiziert.
"Ein Pr
dikat pr
ft eine Bedingung" bedeutet, da
es je nach dem Ergebnis der Bedingung fehlschl
oder erf
llt wird.
Parameter werden in den Beschreibungen wie folgt bezeichnet :
TERM irgendein Term
INTEGER eine Integer-Zahl
VAR eine Variable
VARINT eine Integer-Zahl oder eine Variable
F_TERM ein Term mit Funktor und keinem oder mehreren
Argumenten
AUFRUF siehe F_TERM (aber im Sinne eines zu erf
llenden
Zieles)
ATOM ein Funktor ohne Argumente
NAME siehe ATOM (aber die betrachtete Funktion bezieht
sich auf den druckbaren Namen des Funktors)
ZEICHEN ein aus einem einzelnen Zeichen bestehender NAME
DATEINAME der Name eines Standard-Ein-/Ausgabestroms (siehe
die Funktionen see/tell etc.), oder eine
Spezifikation f
r eine Diskettendatei des TOS, also
z.B. 'B:\ORDNER.1\PROLOG\DATEN.PRO'
AUFRUFLISTE eine (m
glicherweise leere) Liste von AUFRUFEN
ZEICHENLISTE eine (m
glicherweise leere) Liste von ZEICHEN
ZIFFERNLISTE eine ZEICHENLISTE aus Ziffernzeichen
Die Parameter des beschriebenen Pr
dikates werden mit PAR_1, PAR_2
usw. bezeichnet.
In TOY Prolog existieren vordefinierte Operatoren, von denen
einige die Namen von Pr
dikaten sind. Eine Liste davon befindet
sich bei der Beschreibung von op / 3 in Abschnitt III.2.5.4.
III.2.1 Allgemeine Pr
dikate
true
kann immer erf
llt werden.
fail
schl
gt immer fehl.
not AUFRUF
wird erf
llt genau dann, wenn AUFRUF fehlschl
AUFRUF, AUFRUF
wird genau dann erf
llt, wenn beide Parameter
erf
llt werden k
nnen.
AUFRUF; AUFRUF
wird genau dann erf
llt, wenn einer der Parameter
erf
llt werden kann.
check (AUFRUF)
wird genau dann erf
llt, wenn der Parameter erf
werden kann, aber instantiiert keine Variablen.
side_effects (AUFRUF)
quivalent zu check(AUFRUF); sollte benutzt werden,
um zu betonen, da
die Seiteneffekte von AUFRUF
wichtig sind.
once (AUFRUF)
versucht, AUFRUF deterministisch (genau einmal) zu
erf
llen.
III.2.2 Arithmetik mit Integer-Zahlen
sum (INTEGER, INTEGER, INTEGER)
wird erf
llt genau dann, wenn PAR_1+PAR_2 = PAR_3.
sum (INTEGER, INTEGER, VAR)
wird erf
llt, nachdem PAR_3 mit dem Wert von
PAR_1+PAR_2 unifiziert wurde.
sum (INTEGER, VAR, INTEGER)
wird erf
llt, nachdem PAR_2 mit dem Wert von
PAR_3-PAR_1 unifiziert wurde.
sum (VAR, INTEGER, INTEGER)
wird erf
llt, nachdem PAR_1 mit dem Wert von
PAR_3-PAR_2 unifiziert wurde.
prod (INTEGER, INTEGER, INTEGER, INTEGER)
wird erf
llt genau dann, wenn PAR_1*PAR_2+PAR_3 =
PAR_4.
prod (INTEGER, INTEGER, INTEGER, VAR)
wird erf
llt, nachdem PAR_4 mit dem Wert von
PAR_1*PAR_2+PAR_3 unifiziert wurde.
prod (INTEGER, INTEGER, VAR, INTEGER)
wird erf
llt, nachdem PAR_3 mit dem Wert von
PAR_4-PAR_1*PAR_2 unifiziert wurde.
prod (INTEGER, VAR, VAR, INTEGER)
wird erf
llt, nachdem PAR_2 mit dem Wert von
PAR_4 div PAR_1 und PAR_3 mit dem Wert von PAR_4
mod PAR_1 unifiziert wurde.
prod (VAR, INTEGER, VAR, INTEGER)
wie der vorherige Fall, aber PAR_1 vertauscht mit
PAR_2.
prod (INTEGER, VAR, INTEGER, INTEGER)
schl
gt fehl, wenn (PAR_4-PAR_3) mod PAR_1 ungleich
0 ist; andernfalls wird es erf
lt, nachdem PAR_2
mit dem Wert von (PAR_4-PAR_3) div PAR_1 unifiziert
wurde.
prod (VAR, INTEGER, INTEGER, INTEGER)
wie der vorherige Fall, aber PAR_1 vertauscht mit
PAR_2.
TERM is TERM
Es wird angenommen, da
PAR_2 ein aus INTEGERs und
den Standardoperatoren +, - (beide bin
r oder
un
r), *, / und mod zusammengesetzter
arithmetischer Ausdruck ist; falls nicht, schl
das Pr
dikat fehl (es kann auch zu Systemfehlern
kommen, falls PAR_2 freie Variablen enth
Falls PAR_2 ein Ausdruck ist, wird sein Wert
berechnet und versucht, PAR_1 damit zu unifizieren.
is kann auch eine Liste der Form [ INTEGER ] als
den Wert dieser Integer-Zahl berechnen (nach den
Konventionen von Prolog-10).
is wird von anderen Pr
dikaten benutzt, die ihre
Argumente als Ausdr
cke ansehen,z.B. den folgenden.
III.2.3 Vergleich von Zahlen bzw. Namen
less (INTEGER, INTEGER)
wird erf
llt genau dann, wenn PAR_1 < PAR_2.
TERM =:= TERM
wird erf
llt genau dann, wenn PAR_1 und PAR_2
arithmetische Ausdr
cke sind, die denselben Wert
haben.
TERM =\= TERM ( =\= )
wie =:=, aber
berpr
ft, ob die Werte verschieden
sind.
TERM < TERM ( < )
wie =:=, aber
berpr
ft, ob der Wert von PAR_1
kleiner als der Wert von PAR_2 ist.
TERM =< TERM ( =< )
wie <, aber
berpr
ft auf "kleiner oder gleich".
TERM > TERM ( > )
wie <, aber
berpr
ft auf "gr
TERM >= TERM ( >= )
wie <, aber
berpr
ft auf "gr
er oder gleich".
NAME @< NAME ( @< )
wird genau dann erf
llt, wenn PAR_1 in der durch
den erweiterten ASCII-Zeichensatz des ATARI ST
definierten lexikographischen Reihenfolge vor PAR_2
steht.
NAME @=< NAME ( @=< )
wie @<, aber
berpr
ft auf "kleiner oder gleich".
NAME @> NAME ( @> )
wie @<, aber
berpr
ft auf "gr
NAME @>= NAME ( @>= )
wie @<, aber
berpr
ft auf "gr
er oder gleich".
III.2.4 Vergleich von Termen
TERM = TERM
versucht, PAR_1 und PAR_2 zu unifizieren.
eqvar (VAR, VAR)
wird genau dann erf
llt, wenn PAR_1 und PAR_2 zwei
Instanzen derselben, nicht-anonymen Variable sind.
TERM == TERM
wird genau dann erf
llt, wenn PAR_1 und PAR_2 zwei
Instanzen desselben Terms sind.
TERM \== TERM ( \== )
wird genau dann erf
llt, wenn PAR_1 und PAR_2 nicht
zwei Instanzen desselben Terms sind.
III.2.5 Ein- und Ausgabe
III.2.5.1 Datenstr
Die Ein- und Ausgabe in TOY Prolog ST ist an Datenstr
orientiert. Ein Datenstrom ist (vom Benutzer aus gesehen) der Name
bzw. die vollst
ndige Spezifikation einer Diskettendatei, oder der
vordefinierte Name eines speziellen Ein- oder Ausgabeger
Auf eine Diskettendatei kann - sofern sie nicht vom Betriebssystem
aus gegen
berschreiben gesch
tzt ist, und sie sich nicht auf
einer schreibgesch
tzten Diskette befindet, schreibend und lesend
zugegriffen werden. Namen von Datei-Str
men k
nnen z.B. sein :
editor (eines der Hilfsprogramme)
'sysfile.toy' (die Systemdatei)
'b:\ordner.1\daten' (eine Datei namens 'daten' auf einer Diskette
im Laufwerk B im Ordner 'ordner.1')
Bei Datei-Str
men k
nnen Gro
- und Kleinschreibung beliebig
hlt werden.
Ein Dateistrom kann nur in eine Richtung, also nur lesend oder nur
schreibend, ge
ffnet werden. Wird ein Dateistrom mehrmals in einer
Richtung ge
ffnet, so hat das keine Wirkung.
Die vordefinierten Datenstr
me sind vorhanden, um mit anderen
ten bzw. Komponenten des Computers zu kommunizieren.
Auf die vordefinierten Datenstr
me kann nicht immer lesend und
schreibend zugegriffen werden, aber ein vordefinierter Datenstrom
kann, falls Lese- und Schreibzugriff erlaubt sind, in beide
Richtungen gleichzeitig ge
ffnet werden.
Eine Liste der vordefinierten Datenstr
me mit den erlaubten
Zugriffsarten :
Name Lesezugriff Schreibzugriff
user Standard-Benutzereingabe Standard-Benutzerausgabe
(Tastatur, gepuffert) (Bildschirm)
keybd Benutzereingabe Ausgabe an den
(Tastatur, Einzelzeichen) Tastaturcontroller.
modem RS232-Interface lesen RS232 schreiben
midi MIDI-Interface lesen MIDI schreiben
printer nicht erlaubt ! Centronics-Interface
Diese Namen k
nnen wieder gro
- oder kleingeschrieben werden (bei
schreibung Apostrophen nicht vergessen).
III.2.5.2 Umschalten der Ein- und Ausgabestr
nnen bis zu 16 Dateistr
me gleichzeitig offen sein.
see (DATEINAME)
der angegebene Datenstrom wird zum aktuellen
Eingabestrom; handelt es sich um eine noch nicht
ge
ffnete Datei, so wird diese zum Lesen ge
ffnet.
seeing (TERM)
versucht, den Parameter mit dem aktuellen
Eingabestrom zu unifizieren.
seen
ist der aktuellen Eingabestrom eine Datei, so wird
sie geschlossen. Der vordefinierte Datenstrom
'user' wird zum aktuellen Eingabestrom.
tell (DATEINAME)
der angegebene Datenstrom wird zum aktuellen
Ausgabestrom; handelt es sich um eine noch nicht
ge
ffnete Datei, so wird diese auf der Diskette
erzeugt (eine eventuell vorhandene Datei mit dem
gleichen Namen wird gel
scht !) und zum Schreiben
ge
ffnet.
telling (TERM)
versucht, den Parameter mit dem aktuellen
Ausgabestrom zu unifizieren.
told
ist der aktuelle Ausgabestrom eine Datei, so wird
sie geschlossen. Der vorgefinierte Datenstrom
'user' wird zum aktuellen Ausgabestrom.
III.2.5.3 Kontrolle der Eingabe
TOY Prolog besitzt die F
higkeit, die von einem Dateistrom oder
einem Peripherieger
t eingelesenen Zeichen zur Kontrolle auf dem
Bildschirm auszugeben.
echo
schaltet die Kontrollausgabe ein.
noecho
schaltet die Kontrollausgabe aus.
III.2.5.4 Ein- und Ausgabe von Termen; Operatoren
display (TERM)
gibt TERM in Standardform auf den aktuellen
Ausgabestrom aus : Funktoren werden in Pr
fixform
mit Klammern ausgegeben, Namen werden nicht in
Apostrophen gesetzt; Variablen werden als _N
ausgegeben, wobei N eine Zahl ist.
write (TERM)
gibt TERM auf den aktuellen Ausgabestrom aus; die
momentanen Operatorvereinbarungen werden beachtet,
aber Namen werden nicht in Apostrophen gesetzt.
Variablen werden in der Form XN ausgegeben, wobei N
eine Zahl ist; die Numerierung beginnt bei 1.
Achtung : In TOY Prolog wird zur Ausgabe von
Variablen ein Pr
dikat benutzt, das die Variablen
numeriert, indem es sie an Terme der Form 'V'(N)
bindet. Aus diesem Grund werden Terme der Form
'V'(N) nicht korrekt ausgegeben, wenn N eine
Integer-Zahl ist.
writeq (TERM)
wie 'write', aber Namen, die keine wohlgeformten
Worte darstellen, oder die in Konflikt zu einer
momentanen Operatorvereinbarung stehen, werden in
Apostrophen gesetzt. Terme, die mit 'writeq'
ausgegeben wurden, k
nnen mit 'read' wieder
eingelesen werden.
read (TERM)
liest einen durch einen Punkt abgeschlossenen Term
vom aktuellen Eingabestrom; wird nur erf
llt, wenn
dieser Term mit PAR_1 unifiziert werden kann. Die
momentanen Operatorvereinbarungen werden beachtet.
Falls der eingegebene Term syntaktische Fehler
enth
lt, so wird die Meldung
"Bad Term on input. Text skipped:"
ausgegeben, und der eingegebene Text bis zum
n
chsten Punkt au
erhalb eines Kommentares und
au
erhalb von Anf
hrungszeichen
bersprungen (falls
kein Punkt vorhanden ist, sollte der Benutzer ihn
eingeben). Danach wird versucht, PAR_1 mit 'e r r'
zu unifizieren.
Am Ende eines Dateistromes wird die Eingabe auf
'user' umgeschaltet.
op (INTEGER, ATOM, ATOM)
vereinbart PAR_3 als Operator mit Typ PAR_2 und
Priorit
t PAR_1. Es mu
gelten 1
PAR_1
1200;
Operatoren mit kleinerer Priorit
t haben Vorrang.
Die Priorit
t sollte kleiner als 1000 sein, um
Konflikte mit den Operatoren ',', ';', ':-' und
'-->' zu vermeiden.
PAR_2 mu
aus der Menge { xf, yf, fx, fy, xfx, xfy,
yfx, yfy } gew
hlt werden. PAR_3 mu
ohne
Apostrophen druckbar sein.
Falls f
r PAR_3 bereits eine Operatorvereinbarung
besteht, so wird diese gem
den Angaben von PAR_1
und PAR_2, modifiziert : die neue Priorit
t ersetzt
die alte und der neue un
re (bzw. bin
re) Typ
ersetzt den alten un
ren (bzw. bin
ren) Typ. In TOY
Prolog kann ein Operator nur einen un
ren und einen
bin
ren Typ gleichzeitig besitzen (beide mit der
gleichen Priorit
delop (ATOM)
die Operatorvereinbarung f
r PAR_1 wird gel
scht.
PAR_1 sollte in Apostrophen gesetzt werden, da es
zum Zeitpunkt der Eingabe von 'delop' ja noch ein
Operator ist.
Folgende Standardoperatoren sind bereits vereinbart :
:- xfx, fx 1200
--> xfx 1200
; xfy 1100
, xfy 1000
not fy 900
= xfx 700
is xfx 700
=:= xfx 700
=\= xfx 700
< xfx 700
=< xfx 700
> xfx 700
>= xfx 700
@< xfx 700
@=< xfx 700
@> xfx 700
@>= xfx 700
== xfx 700
\== xfx 700
=.. xfx 700
+ yfx, fx 500
- yfx, fx 500
* yfx 400
/ yfx 400
mod xfx 300
III.2.5.5 Einzelzeichen
In TOY Prolog werden Einzelzeichen, anders als in Prolog-10, durch
Atome dargestellt, deren Namen aus genau einem Zeichen besteht (in
Prolog-10 als deren ASCII-Darstellung, also als Zahlen).
TOY Prolog ST unterst
tzt den erweiterten Zeichensatz von GEM;
dabei werden deutsche (franz
sische, spanische, ...) Buchstaben
auch wirklich als Buchstaben erkannt (!).
r Zeichenketten existiert eine besondere Darstellungsform.
Zeichenketten werden als Listen von Einzelzeichen betrachtet
(nicht wie in Prolog-10 als Listen von ASCII-Codes); die Notation
r Zeichenketten benutzt Anf
hrungszeichen ("), um eine
Zeichenkette einzuschlie
en. Wie
blich bezeichnet ein
verdoppeltes Anf
hrungszeichen ("") im Inneren einer Zeichenkette
ein in die Zeichenkette aufzunehmendes einzelnes ".
Die folgenden Pr
dikate sind f
r die Verarbeitung von
Einzelzeichen vorgesehen:
ordchr (INTEGER, ZEICHEN)
wird genau dann erf
llt, wenn PAR_1 die Ordinalzahl
des Zeichens PAR_2 ist.
ordchr (VAR, ZEICHEN)
wird erf
llt, nachdem PAR_1 mit der Ordinalzahl von
PAR_2 unifiziert wurde.
ordchr (INTEGER, VAR)
wird erf
llt, nachdem PAR_2 mit dem Zeichen
unifiziert wurde, dessen Ordinalzahl PAR_1 mod 256
ist.
iseoln (TERM)
versucht, PAR_1 mit dem Zeilenendezeichen zu
unifizieren. TOY Prolog wandelt jedes Zeilenende in
ein einzelnes 'CR' um.
smalletter (TERM)
berpr
ft, ob PAR_1 ein Kleinbuchstabe ist.
bigletter (TERM)
berpr
ft, ob PAR_1 ein Gro
buchstabe ist.
letter (TERM)
berpr
ft, ob PAR_1 ein Buchstabe ist.
digit (TERM)
berpr
ft, ob PAR_1 eine Dezimalziffer ist.
alphanum (TERM)
berpr
ft, ob PAR_1 ein Buchstabe, eine Ziffer oder
ein Tiefstrich (_) ist.
bracket (TERM)
berpr
ft, ob PAR_1 eines der Zeichen ( ) [ ] { }
ist.
solochar (TERM)
berpr
ft, ob PAR_1 eines der Zeichen ! , ; ist.
symch (TERM)
berpr
ft, ob PAR_1 ein Symbolzeichen ist.
III.2.5.6 Ein- und Ausgabe von Einzelzeichen
r die Ein- und Ausgabe von Einzelzeichen gibt es eine Anzahl
besonderer Pr
dikate. Diese arbeiten nicht - wie in Prolog-10 -
mit ASCII-Codes. Die Pr
dikate von Prolog-10, die die Ein- und
Ausgabe von Einzelzeichen erledigen, k
nnten etwa wie folgt
definiert werden (nicht vollst
ndig kompatibel):
get0(Ord) :- rch, lastch(Ch), ordchr(Ord, Ch).
get(Ord) :- rch, skipbl, lastch(Ch), ordchr(Ord, Ch).
skip(X) :- repeat, get0(X), !.
put(Ord) :- ordchr(Ord, Ch), wch(Ch).
Der Hauptunterschied zwischen TOY Prolog und Prolog-10 bei der
Verarbeitung von Einzelzeichen liegt darin, da
TOY Prolog einen
Puffer f
r das letzte eingegebene Zeichen unterh
lt; in TOY Prolog
kann daher mehrmals, auch nach eventuellem Backtracking, auf ein
eingegebenes Zeichen zugegriffen werden.
Wird bei der Eingabe ein Zeilenende erreicht, so wird es als ein
einzelnes 'CR' in den Eingabepuffer ("letztes Zeichen")
geschrieben. Wird das Ende eines Dateistromes erreicht, so f
der Interpreter selbst
ndig das Pr
dikat 'seen' aus; die folgenden
Zeichen werden vom Benutzerstrom gelesen. Dieser Vorgang wird dem
Benutzer durch eine Meldung mitgeteilt.
Die Pr
dikate f
r die Ein- und Ausgabe von Einzelzeichen :
wird erf
llt, nachdem das n
chste Zeichen vom
aktuellen Eingabestrom in das letzte Zeichen
geschrieben wurde.
skipbl
wird erf
llt, nachdem sichergestellt wurde, da
das
letzte Zeichen ein druckbares Zeichen enth
(ASCII-Code > 32). Falls ein solches Zeichen
bereits im letzten Zeichen steht, wird nichts
getan, andernfalls wird 'rch' ausgef
lastch (TERM)
versucht, PAR_1 mit dem letzten Zeichen zu
unifizieren.
rdch (TERM)
liest das n
chste Zeichen vom Eingabestrom und
schreibt es in das letzte Zeichen; macht eine Kopie
des letzten Zeichens, wobei nichtdruckbare Zeichen
als Leerraum angesehen werden; versucht, die Kopie
mit PAR_1 zu unifizieren.
rdchsk (TERM)
wie 'rdch', aber vorher wird 'skipbl' ausgef
wch (ZEICHEN)
schreibt das Zeichen in den aktuellen Ausgabestrom.
'CR' wird als Zeilentrenner interpretiert.
beendet die momentane Zeile (gibt 'CR' aus).
bell
gibt das Zeichen 'Bel' aus; bei Ausgabe auf den
Benutzerstrom bewirkt dieses Zeichen das Ert
eines 'Glockentones'.
Der ATARI ST interpretiert das Zeichen 'Esc' (escape) als
besonderes Steuerzeichen; wird 'Esc' auf den Benutzerstrom
ausgegeben, so bewirken die n
chsten 1-3 Zeichen eine Ver
nderung
von Parametern der Bildschirmausgabe. Es existieren spezielle
dikate zur Ausgabe von Escape-Sequenzen :
escape
gibt 'Esc' aus.
gibt 'Esc', 'E' aus; der Bildschirminhalt wird
gel
scht.
III.2.6 Typen
berpr
var (TERM)
wird genau dann erf
llt, wenn PAR_1 eine freie
Variable ist.
integer (TERM)
wird genau dann erf
llt, wenn PAR_1 eine Integer-
Zahl ist.
nonvarint (TERM)
wird genau dann erf
llt, wenn PAR_1 ein F_TERM ist.
atom (TERM)
wird genau dann erf
llt, wenn PAR_1 ein ATOM ist.
III.2.7 Zugriff auf die Termstruktur
pname (NAME, TERM)
erzeugt eine Liste der einzelnen Zeichen von PAR_1
und versucht, diese Liste mit PAR_2 zu unifizieren.
pname (VAR, ZEICHENLISTE)
wird erf
llt, nachdem PAR_1 mit einem NAMEn
unifiziert wurde, der aus den einzelnen Zeichen von
PAR_2 besteht.
pnamei (INTEGER, TERM)
erzeugt eine Liste von Ziffernzeichen, die die
dezimale Darstellung von PAR_1 bilden, und
versucht, diese Liste mit PAR_2 zu unifizieren.
PAR_1 darf nicht negativ sein.
pnamei (VAR, ZIFFERNLISTE)
wird erf
llt, nachdem PAR_1 mit der Integer-Zahl
unifiziert wurde, deren Dezimaldarstellung die
Zeichen von PAR_2 sind. Auch bei korrekten
Parametern kann ein Fehler auftreten, wenn die Zahl
gr
er als die gr
te darstellbare Integer-Zahl
wird. In dieser Implementation sind Zahlen bis
32767 ( = 215-1) darstellbar.
'pname' und 'pnamei' ersetzen die Funktion 'name' von Prolog-10,
die zwar
hnlich arbeitet, aber ASCII-Codes anstelle der in TOY
Prolog verwendeten Zeichendarstellung benutzt.
functor (VAR, INTEGER, 0)
PAR_3 ist die Zahl 0; dieser Aufruf wird erf
llt,
nachdem PAR_1 mit PAR_2 unifiziert wurde.
functor (VAR, NAME, INTEGER)
wird erf
llt, nachdem PAR_1 mit einem F_TERM
unifiziert wurde, dessen Funktor den Namen und die
Stelligkeit hat, die durch PAR_2 und PAR_3
festgelegt werden, und dessen Argumente
verschiedene freie Variablen sind. PAR_3 darf nicht
negativ sein.
functor (INTEGER, TERM, TERM)
versucht, PAR_2 mit PAR_1 und PAR_3 mit der Zahl 0
zu unifizieren.
functor (F_TERM, TERM, TERM)
versucht, PAR_2 mit dem Namen und PAR_3 mit der
Stelligkeit des
ersten Funktors von PAR_1 zu
unifizieren.
arg (INTEGER, F_TERM, TERM)
schl
gt fehl, falls PAR_1 kleiner als 1 oder gr
als die Stelligkeit des
ersten Funktors von
PAR_2 ist; ansonsten wird versucht, PAR_3 mit dem
PAR_1-ten Argument von PAR_2 zu unifizieren.
VAR =.. [INTEGER]
wird erf
llt, nachdem PAR_1 mit der Zahl in PAR_2
unifiziert wurde.
VAR =.. [NAME | TERM]
falls der TERM in PAR_2 keine 'geschlossene' Liste
ist, wird ein Fehler im Pr
dikat length / 2 erzeugt
('=..' benutzt 'length'). Ansonsten wird ein Term
erzeugt, dessen Funktor NAME und dessen
Argumentliste TERM ist;dieser Term wird mit PAR_1
unifiziert.
INTEGER =.. TERM
versucht, PAR_2 mit [PAR_1] zu unifizieren.
F_TERM =.. TERM
erzeugt eine Liste, deren Kopf der
erste Funktor
von PAR_1 und deren Rumpf die Liste der Argumente
von PAR_1 ist; versucht, diese Liste mit PAR_2 zu
unifizieren.
III.2.8 Zugriff auf Pr
dikate in der Datenbank
protect (NAME, INTEGER)
sch
tzt das Pr
dikat mit Namen PAR_1 und
Stelligkeit PAR_2 gegen Ver
nderungen durch die
weiter unten angegebenen Pr
dikate.
protect
sch
tzt s
mtliche in der Datenbank vorhandenen
Pr
dikate.
unprotect (NAME, INTEGER)
hebt den Schutz f
r das Pr
dikat mit Namen PAR_1
und Stelligkeit PAR_2 wieder auf.
unprotect
hebt den Schutz aller Pr
dikate auf.
Die Datenbank kann durch folgende Pr
dikate ver
ndert werden:
assert (F_TERM, AUFRUFLISTE, INTEGER)
PAR_1 wird als der Kopf einer Klausel, PAR_2 als
deren Rumpf betrachtet; diese Klausel wird direkt
nach der n-ten Klausel der entsprechenden Prozedur
in die Datenbank eingef
gt ( n = PAR_3, falls die
Klausel mit dieser Nummer existiert; n = Nummer der
letzten Klausel, falls PAR_3 > Anzahl der Klauseln;
falls keine Klauseln existieren, bzw. PAR_3 < 1,
wird die neue Klausel als erste eingef
retract (NAME, INTEGER, INTEGER)
PAR_2 darf nicht negativ sein. PAR_1 und PAR_2
geben Namen und Stelligkeit eines Pr
dikates an;
falls das entsprechende Pr
dikat keine Klausel mit
der Nummer PAR_3 besitzt, schl
gt 'retract' fehl;
sonst wird die entsprechende Klausel aus der
Datenbank entfernt, und 'retract' wird erf
llt.
Achtung : Falls zum Zeitpunkt der L
schung noch
Instanzen der gel
schten Klausel aktiv sind, werden
in den allermeisten F
llen katastrophale Fehler
auftreten !
clause (NAME, INTEGER, INTEGER, TERM, TERM)
PAR_2 darf nicht negativ sein. PAR_1 und PAR_2
geben Namen und Stelligkeit eines Pr
dikates an;
falls das entsprechende Pr
dikat keine Klausel mit
der Nummer PAR_3 besitzt, schl
gt 'clause' fehl;
sonst wird versucht, PAR_4 mit deren Kopf und PAR_5
mit deren Rumpf zu unifizieren.
asserta (F_TERM)
behandelt PAR_1 als eine Klausel; falls der
erste Funktor ':-' ist, und das erste seiner
Argumente kein F_TERM , wird ein Fehler erzeugt.
Die Klausel wird als erste Klausel des
entsprechenden Pr
dikates in die Datenbank
eingef
assertz (F_TERM)
wie 'asserta', aber die Klausel wird als letzte
Klausel des entsprechenden Pr
dikates in die
Datenbank eingef
assert (F_TERM)
ein Synonym f
r 'asserta'.
retract (F_TERM)
behandelt PAR_1 als eine Klausel; falls deren
erster Funktor ':- ist, und das erste seiner
Argumente kein F_TERM, so wird ein Fehler erzeugt.
Die erste Klausel, die mit PAR_1 unifiziert werden
kann, wird aus der Datenbank entfernt (falls PAR_1
die Form F_TERM :- VAR hat, kann es nur mit
Klauseln unifiziert werden, deren Rumpf aus einem
einzigen Variablenaufruf besteht !). Wenn 'retract'
wiedererf
llt werden soll, wird die n
chste mit
PAR_1 unifizierbare Klausel entfernt, usw.
clause (F_TERM, TERM)
findet die erste Klausel, deren Kopf mit PAR_1 und
deren Rumpf mit PAR_2 unifiziert werden kann. Wird
nach erfolgreicher Unifikation erf
llt; soll
'clause' wiedererf
llt werden, so wird die n
chste
Klausel gesucht, usw.
redefine
wird f
r die Implementierung von 'reconsult'
gebraucht (sollte nicht direkt aufgerufen werden).
Zwischen zwei Aufrufen von 'redefine' verh
lt sich
'assert' anders als normal : wenn eine Klausel mit
'assert' gespeichert werden soll, die nicht zu dem
zuletzt mit 'assert' gespeicherten Pr
dikat geh
wird vorher das gesamte Pr
dikat gel
scht, zu dem
die neue Klausel geh
abolish (NAME, INTEGER)
PAR_2 darf nicht negativ sein; das Pr
dikat mit
Namen PAR_1 und Stelligkeit PAR_2 wird vollst
ndig
gel
scht.
predefined (NAME, INTEGER)
PAR_2 darf nicht neagtiv sein; 'predefined'
berpr
ft, ob das Pr
dikat mit Namen PAR_1 und
Stelligkeit PAR_2 eine Systemfunktion ist.
consult (DATEINAME)
schaltet den aktuellen Eingabestrom um und liest
Klauseln, die danach mit 'assertz' gespeichert
werden. Es gibt dabei zwei Ausnahmen : der Term
'end' beendet den Einlesemodus und stellt den alten
Eingabestrom wieder her; Terme mit dem Funktor
':-'/1 werden als Kommandos betrachtet und sofort
ausgef
reconsult (DATEINAME)
wie 'consult', aber vor und nach dem Einlesen wird
'redefine' aufgerufen, so da
zusammenh
ngende
Folgen von Klauseln eines Pr
dikates das alte
Pr
dikat ersetzen, statt es zu erg
nzen.
consultall (TERM)
PAR_1 mu
eine Liste von DATEINAMEn oder Termen der
Form '- DATEINAME' sein (auch gemischt); f
r jeden
einfachen DATEINAMEN wird 'consult', f
r jeden
DATEINAMEN mit '-'/1 wird 'reconsult' aufgerufen.
Dieses Pr
dikat wird von der Benutzerschnittstelle
aufgerufen, wenn eine Liste als Kommando eingegeben
wurde.
listing (F_TERM)
PAR_1 mu
ein ATOM, oder ein Term der Form
ATOM/INTEGER, oder eine (eventuell verschachtelte)
Liste solcher Terme sein; jedes ATOM wird als Name,
jede Zahl als Stelligkeit eines Pr
dikates
betrachtet. Alle Klauseln, die zu dem jeweiligen
Pr
dikat geh
ren, werden auf den aktuellen
Ausgabestrom ausgegeben.
listing
wie listing/1, aber es werden alle Pr
dikate,
einschlie
lich der vordefinierten Pr
dikate,
ausgegeben. Die Reihenfolge wird durch die 'hash'-
Funktion des inneren Interpreters festgelegt
und kann nicht ge
ndert werden.
proc (TERM)
versucht, PAR_1 mit einem F_TERM zu unifizieren,
der den Namen und die Stelligkeit des ersten
Pr
dikates in der Datenbank besitzt; soll 'proc'
wiedererf
llt werden, wird das jeweils n
chste
Pr
dikat benutzt; schl
gt fehl, wenn kein solches
Pr
dikat mehr da ist. Zur Reihenfolge der Pr
dikate
siehe listing/0.
III.2.9 Kontrolle des Programmablaufs
Bezeichnungen :
Wenn der Aufruf eines Pr
dikats eine Klausel aktiviert, die
nicht die letzte ihres Pr
dikats ist, so wird dieser Kausel
ein Zeiger in die Datenbank zugeordnet. Dieser Zeiger wird
verwendet, wenn das aufgerufene Ziel wiedererf
llt werden
mu
Die direkten Nachkommen eines Aufrufes A sind die Aufrufe in
der durch A aktivierten Klausel. Der direkte Vorfahr von A
ist der Aufruf, der die Klausel aktivierte, in der A
vorkommt. Ein Vorfahr von A ist der direkte Vorfahr oder ein
Vorfahr des direkten Vorfahrs; ein Nachkomme von A ist ein
direkter Nachkomme oder einer von dessen Nachkommen.
! ('cut', manchmal auch 'slash')
wird erf
llt, nachdem der n
chste Vorfahr gefunden
wurde, der nicht call/1, tag/1, ,/2 oder ;/2 ist.
Alle Datenbankzeiger, die zu diesem Vorfahren und
allen seinen Nachkommen geh
ren, werden entfernt.
repeat
wird erf
llt, und kann beliebig oft wiedererf
werden.
call (AUFRUF)
verh
lt sich so, als ob PAR_1 anstelle des Aufrufs
von 'call' st
nde; allerdings wird ein fehlerhafter
Parameter bei Verwendung von 'call' erst zur
Laufzeit des Programms erkannt. Im
eren
Interpreter kann eine Variable anstelle eines
Pr
dikates als Aufruf in einer Klausel vorkommen;
ein solcher Variablenaufruf wird vom
eren
Interpreter in einen Aufruf von 'call' umgewandelt.
tag (AUFRUF)
eine andere Form von call(AUFRUF); auf einen Aufruf
von 'tag' kann mit den Pr
dikaten 'tagfail',
'tagexit', 'tagcut' und 'ancestor' zugegriffen
werden. PAR_1 hei
t markierter Vorfahr seiner
Nachkommen.
Ein Aufruf von 'tag' wird von 'tagfail' etc. nur
dann erkannt, wenn er explizit in einer Klausel
steht; z.B. wird call(tag(A)) nicht erkannt.
ancestor (TERM)
sucht nach dem n
chsten markierten Vorfahren, der
mit PAR_1 unifiziert werden kann; wird keiner
gefunden, so schl
gt 'ancestor' fehl, ansonsten
werden der Vorfahr und PAR_1 unifiziert und
'ancestor' erf
tagcut (TERM)
wie 'ancestor', aber bei Erfolg werden s
mtliche zu
dem gefundenen Vorfahren und seinen Nachkommen
geh
renden Datenbankzeiger entfernt.
tagfail (TERM)
sucht nach dem n
chsten mit PAR_1 unifizierbaren
markierten Vorfahren; schl
gt fehl, falls keiner
gefunden wird. Wird ein markierter Vorfahr
gefunden, so schl
gt dieser sofort fehl.
tagexit (TERM)
sucht nach dem n
chsten mit PAR_1 unifizierbaren
markierten Vorfahren; schl
gt fehl, falls keiner
gefunden wird. Wird ein markierter Vorfahr
gefunden, so wird er mit PAR_1 unifiziert und
sofort erf
llt (d.h. der Aufruf nach tag(...) wird
als n
chstes betrachtet).
halt (ATOM)
gibt ATOM aus und beendet den inneren Interpreter.
stop
beendet die Hauptschleife des
eren Interpreters;
im Normalfall wird 'halt' aufgerufen und auch der
innere Interpreter beendet. Ausnahmen sind m
glich
(z.B. im Editor).
sysload (DATEINAME)
beendet den
eren Interpreter und schaltet den
aktuellen Eingabestrom auf die angegebene Datei um.
Diese Datei sollte ein Programm in der Syntax des
inneren Interpreters enthalten (siehe Anhang).
Nach einem 'seen', bzw. bei Erreichen des
Dateiendes, wird der
ere Interpreter wieder
gestartet.
III.2.10 Hilfsmittel zum Testen von Programmen
In der ST-Version von TOY Prolog gibt es die M
glichkeit, den
Ablauf eines Programms durch Dr
cken der Tastenkombination
'Shift' 'Alternate' 'Help'
zu unterbrechen. Das momentane Ziel wird in der Form
INTR: .......
ausgegeben, und der Benutzer erh
lt die M
glichkeit, den
Programmablauf zu ver
ndern. Dazu kann er folgende Optionen
hlen:
A (Abort) Das gesamte zu erf
llende Ziel wird
abgebrochen (einschlie
lich des
eren
Interpreters).
B (Backtrace) Die Vorfahren des momentanen Zieles werden
angezeigt.
C (Continue) Das momentane Ziel wird bearbeitet.
D (Debug ON/OFF) Der Testmodus wird ein- oder ausgeschaltet
(siehe 'debug').
F (Fail) Das momentane Ziel schl
gt fehl.
S (Step ON/OFF) Der Einzelschrittmodus wird ein- oder
ausgeschaltet; ist er eingeschaltet, so wird
das Programm vor der Bearbeitung des n
chsten
Zieles von selbst wieder unterbrochen.
Es existieren au
erdem einige Pr
dikate, die den Programmtest
erleichtern sollen:
interrupt
untebricht den Programmablauf (als h
tte der
Benutzer die Taste 'Help' gedr
ckt).
debug
schaltet den Testmodus ein. Im Testmodus wird jedes
zu bearbeitende Ziel mit einer Information
ausgegeben, die anzeigt, ob das Ziel
- das erste Mal aufgerufen wird (CALL: ...)
- wiedererf
llt werden soll (REDO: ...)
- erfolgreich beendet wird (EXIT: ...)
- oder fehlschl
gt (FAIL: ...).
nodebug
schaltet den Testmodus aus.
nonexistent
schaltet die
berwachung der Aufrufe von
undefinierten Pr
dikaten ein. Nach 'nonexistent'
wird beim Aufruf eines undefinierten Pr
dikates
eine Meldung ausgegeben.
nononexistent
schaltet diese Meldungen wieder aus.
Die folgenden beiden Pr
dikate schalten den Testmodus selektiv f
bestimmte Aufrufe ein:
spy (NAME, INTEGER)
PAR_2 darf nicht negativ sein; der Testmodus wird
f
r das Pr
dikat mit dem Namen PAR_1 und der
Stelligkeit PAR_2 eingeschaltet.
spy (NAME, VAR)
dito, aber f
r alle Pr
dikate mit diesem Namen; die
Variable wird nicht instantiiert.
spy (VAR, INTEGER)
dito, aber f
r alle Pr
dikate mit gegebener
Stelligkeit.
spy (VAR, VAR)
dito, aber f
r alle Pr
dikate. Der Effekt ist der
gleiche wie bei 'debug', kann aber nicht mit
'nodebug' wieder abgeschaltet werden (!). Da die
Variablen nicht instantiiert werden, kann man
zweimal dieselbe Variable verwenden.
nospy (PAR1, PAR2)
schaltet den Testmodus selektiv wieder ab. Alle
Aufrufmuster von 'spy' k
nnen in der gleichen Weise
wie dort verwendet werden. 'nospy' kann den mit
'debug' eingeschalteten allgemeinen Testmodus nicht
ausschalten.
spied (NAME, INTEGER)
berpr
ft, ob der selektive Testmodus f
r das
Pr
dikat mit Namen PAR_1 und Stelligkeit PAR_2
eingeschaltet ist.
III.2.11 Verarbeitung von grammatikalischen Regeln
phrase (AUFRUF, TERM)
behandelt PAR_1 als nicht-terminales Symbol einer
grammatikalischen Regel und veranla
t die
Verarbeitung von PAR_2, wobei PAR_1 als Startsymbol
verwendet wird.
III.2.12 Verschiedene Funktionen
length (F_TERM, TERM)
PAR_1 mu
eine 'geschlossene' Liste sein, deren
L
nge berechnet wird. Es wird versucht, das
Ergebnis mit PAR_2 zu unifizieren.
isclosedlist (TERM)
berpr
ft, ob PAR_1 eine 'geschlossene' Liste ist.
numbervars (TERM)
instantiiert die Variablen, die in PAR_1 vorkommen,
mit 'V'(1), 'V'(2), ... . Variablen, die aneinander
gebunden sind, werden mit dem selben 'V'(n)
instantiiert.
member (TERM, TERM)
berpr
ft, ob PAR_1 ein Element der Liste PAR_2
ist. Falls PAR_2 eine 'offene' Liste ist, die PAR_1
nicht enth
lt, so wird 'member' erf
llt, nachdem
die Liste um PAR_1 erweitert wurde.
bagof (TERM, AUFRUF, TERM)
versucht, PAR_3 mit einer Liste der f
r PAR_1 -
nach allen m
glichen Berechnungen von PAR_2 -
ermittelten Instantiierungen zu unifizieren.
status
gibt eine
bersicht
ber die momentane
Speicherbelegung.
Die folgenden Pr
dikate benutzen die Uhr des ATARI ST:
date (VARINT, VARINT, VARINT)
versucht, PAR_1, PAR_2 und PAR_3 mit Zahlen zu
unifizieren, die das Datum in der Form "Tag, Monat,
Jahr" angeben.
set_date (INTEGER, INTEGER, INTEGER)
setzt das Datum fest : Par_1 - Tag, PAR_2 - Monat,
PAR_3 - Jahr.
time (VARINT, VARINT, VARINT)
versucht, PAR_1, PAR_2 und PAR_3 mit Zahlen zu
unifizieren, die die Tageszeit in der Form "Stunde,
Minute, Sekunde" angeben.
set_time (INTEGER, INTEGER, INTEGER)
stellt die Uhr (PAR_1 Stunde, PAR_2 Minute, PAR_3
Sekunde).
'time' und 'set_time' arbeiten mit Einheiten von 2 Sekunden.
translate (DATEINAME, DATEINAME)
schaltet die Eingabe auf PAR_1 und die Ausgabe auf
PAR_2 um und
bersetzt das von PAR_1 gelesene
Programm in die Syntax des inneren Interpreters.
Das Ergebnis ist eine Datei, die mit 'sysload'
eingelesen werden kann.
Siehe auch die Abschnitte
ber 'consult',
'sysload', sowie den Anhang.
III.3 Die GEM-Funktionen
TOY Prolog ST kann auf einige der Funktionen von VDI und AES
zugreifen. Genaueres zu diesen Funktionen kann hier nicht
angegeben werden.
In den folgenden Kurzbeschreibungen sind alle Parameter, soweit
nicht anders angegeben, INTEGER-Zahlen.
III.3.1 Kontrollfunktionen
grf_clip (Flag, X1, Y1, X2, Y2)
Falls Flag = 0, wird das Clipping ausgeschaltet,
sonst eingeschaltet; (X1, Y1) und (X2, Y2) sind
diagonal gegen
berliegende Ecken des Clipping-
Rechtecks.
grf_wrmode (Modus)
Stellt den Schreibmodus ein :
0 - Replace - Modus
1 - Transparent-Modus
2 - XOR - Modus
3 - Reverse-Transparent-Modus
grf_colour (Index, Rot, Gr
n Blau)
Setzt die Farbzusammensetzung f
r die Farbe mit der
Nummer Index fest. Rot, Gr
n und Blau liegen im
Bereich 1 - 1000.
grf_mode
Schaltet den Grafikmodus ein.
txt_mode
Schaltet den Textmodus ein.
III.3.2 Graphische Ausgabe
grf_pline (Koordinatenliste)
PAR_1 mu
eine Liste mit einer geraden Anzahl von
INTEGERs sein. Je zwei der Listenelemente werden
als Koordinaten betrachtet; es wird ein Polygonzug
(Polyline) gezeichnet.
grf_pmarker (Koordinatenliste)
Es wird eine Anzahl von Markierungen mit den durch
PAR_1 angegebenen Koordinaten gezeichnet.
grf_poly (Koordinatenliste)
Es wird ein ausgef
lltes Polygon gezeichnet.
grf_fill (X, Y, Index)
Eine Fl
che wird bis zu ihrem Rand ausgef
llt,
ausgehend vom Punkt (X, Y). Index ist der
urspr
ngliche Farbindex der Fl
grf_box (X1, Y1, X2, Y2)
Es wird ein ausgef
lltes Rechteck gezeichnet;
(X1, Y1) und (X2, Y2) sind gegen
berliegende Ecken.
grf_bar (X1, Y1, X2, Y2)
dito, aber das Rechteck wird umrandet.
grf_arc (X, Y, R, Alpha, Omega)
Ein Kreisbogen mit Mittelpunkt (X, Y), Radius R,
Startwinkel Alpha und Endwinkel Omega wird
gezeichnet.
grf_pie (X, Y, R, Alpha, Omega)
dito, aber ausgef
llter Kreissektor.
grf_circle (X, Y, R)
Ein ausgef
llter Kreis mit Mittelpunkt (X, Y) und
Radius R wird gezeichnet.
grf_ellipse (X, Y, Xrad, Yrad)
Eine ausgef
llte Ellipse mit Mittelpunkt (X, Y) und
Achsenabschnitten Xrad und Yrad wird gezeichnet.
grf_rbox (X1, Y1, X2, Y2)
Zeichnet ein nicht ausgef
lltes Rechteck mit
abgerundeten Ecken.
grf_rfbox (X1, Y1, X2, Y2)
Wie 'grf_rbox', aber ausgef
lltes Rechteck.
grf_text (X, Y, Text)
Text ist ein NAME, der an der Position (X, Y) als
Grafiktext ausgegeben wird.
III.3.3 Attribute-Funktionen
grf_l_colour (Index)
Setzt die Linienfarbe fest.
grf_l_type (Style)
Setzt den Linientyp fest :
1 : durchgezogen
2 - 6 : gestrichelt
7 : frei definierbar
grf_l_udstyle (Pattern)
Setzt den frei definierbaren Linientyp fest.
Pattern ist eine INTEGER-Zahl, deren 16 Bits das
Muster festlegen.
grf_l_width (Width)
Setzt die Linienbreite fest.
grf_l_ends (Begin, End)
Setzt das Aussehen von Linienanfang (Begin) und
-ende (End) fest.
0 : kantig
1 : Pfeil
2 : abgerundet
grf_m_colour (Index)
Setzt die Farbe der Markierungen fest.
grf_m_type (Type)
Setzt den Markierungstyp fest.
1 : Punkt
2 : Kreuz
3 : Stern
4 : Quadrat
5 : Diagonalkreuz
6 : Raute
grf_m_height (Height)
Setzt die Markierungsgr
e fest.
grf_t_height (Height)
Setzt die Textgr
e fest.
grf_t_point (Point)
Setzt die Textgr
e in Punkt fest.
grf_t_rotation (Angle)
Setzt den Winkel fest, um den die Textgrundlinie
gedreht wird.
grf_t_colour (Index)
Setzt die Textfarbe fest.
grf_t_effects (Effects)
Setzt die Texteffekte fest. Effects entsteht als
Summe der gew
nschten Effekte :
1 : Fettdruck
2 : Helle Schrift
4 : Kursivschrift
8 : Unterstreichung
16 : Au
enrand der Buchstaben
grf_t_align (Hor, Vert)
Setzt die Textausrichtung fest.
Hor : horizontale Ausrichtung -
0 : links
1 : zentriert
2 : rechts
Vert : vertikale Ausrichtung -
0 : Grundlinie
1 : Obergrenze Kleinbuchstaben
2 : Obergrenze Zeichen
3 : Untergrenze Zeichenbox
4 : Untergrenze Unterl
5 : Obergrenze Zeichenbox
grf_f_colour (Index)
Setzt die F
llfarbe fest.
grf_f_type (Interior)
Setzt den F
lltyp fest :
0 : leer
1 : voll
2 : gemustert
3 : schraffiert
4 : frei definierbar
grf_f_style (Style)
Setzt f
r die F
lltypen 2 und 3 den F
llstil fest.
grf_f_perim (Flag)
Schaltet die Umrandung von ausgef
llten Fl
chen an
(Flag = 1) oder aus (Flag = 0).
grf_f_udpat (Pattern)
Pattern mu
eine Liste mit genau 16 INTEGER-Zahlen
sein. Die 16 Zahlen werden als Muster f
r den
F
lltyp 4 verwendet.
III.3.4 Funktionen zur Maussteuerung
grf_mse_hide
Schaltet die Maus (den Grafikcursor) aus.
grf_mse_show (Flag)
Ist Flag = 0, so wird die Maus sofort wieder
eingeschaltet; ansonsten wird sie erst dann wieder
eingeschaltet, wenn 'grf_mse_show' genauso oft
aufgerufen wurde wie vorher 'grf_mse_hide'.
grf_mse_form (Form)
Schaltet eine vordefinierte Mausform ein.
0 : Pfeil
1 : 'Cursor'
2 : Biene
3 : zeigende Hand
4 : flache Hand
5 : d
nnes Kreuz
6 : dickes Kreuz
7 : Umri
kreuz
255 : Bleistift
grf_mse_form (Xhot, Yhot, Mask, Data, Pattern)
Schaltet eine frei definierte Mausform ein :
Xhot und Yhot sind die Koordinaten des
Aktionspunktes innerhalb des 16x16-Rasters, Mask
und Data sind die Hinter- bzw. Vordergrundfarbe.
Pattern mu
eine aus genau 32 INTEGER-Zahlen
bestehende Liste sein; die ersten 16 davon geben
die Maske, die letzten 16 die Daten f
r das Raster
an.
grf_mse_state (Button, X, Y)
Die Parameter m
ssen Variablen oder INTEGER-Zahlen
sein; es wird versucht, Button mit dem momentanen
Zustand der Maustasten und X bzw. Y mit der
momentanen Position des Grafikcursors zu
unifizieren.
III.3.5 Darstellen einer Warnmeldung
alert (Defbutton, Alert, Exbutton)
Alert mu
ein NAME sein; die Zeichen des Namens
werden als Zeichenkette betrachtet.
Die AES-Funktion 'form_alert' wird aufgerufen; es
wird versucht, den Wert, den sie zur
ckliefert, mit
Exbutton zu unifizieren.
Exbutton mu
eine Integer-Zahl oder eine Variable
sein.
III.4 Namen der Systemfunktionen
Die Namen der Systemfunktionen k
nnen ge
ndert werden, indem man
die Beschreibungen im zweiten Abschnitt der Systemdatei
ndert
(siehe Anhang). Dabei ist darauf zu achten, da
weder die
Reihenfolge noch die Anzahl der Namen ge
ndert wird, und da
die
Stelligkeiten erhalten bleiben.
Es empfiehlt sich, vor einer
nderung eine neue Version der
Benutzerschnittstelle herzustellen, da nach einer
nderung die
vorherige Version wahrscheinlich nicht mehr lauff
hig ist. Das
Gleiche gilt f
r alle anderen Programme.
Die Namen der vordefinierten Pr
dikate k
nnen nur ge
ndert werden,
indem deren Definition in der Systemdatei, bzw. (bei Pr
dikaten,
die zur Benutzerschnittstelle geh
ren) im Quelltext ge
ndert
werden. Auch hierf
r gelten die obigen Hinweise.
IV. Die Hilfsprogramme von TOY Prolog
IV.1 Der
bersetzer f
r die Benutzerschnittstelle
Quellcode und Zwischencode : 'BOOTER.TOY'.
Das Programm 'BOOTER.TOY' wird ben
tigt, um nach
nderungen der
Benutzerschnittstelle eine neue Version der Systemdatei
herzustellen. Die Benutzerschnittstelle ist nicht im vollst
ndigen
Prolog geschrieben, sondern in einer 'abgemagerten' Version, die
sich leicht in die Syntax des inneren Interpreters
bersetzen
t. Der
bersetzer erledigt genau diese Arbeit.
Benutzung des
bersetzers
Um eine neue Version der Benutzerschnittstelle zu
bersetzen, wird
bersetzer mit 'sysload' geladen.
Der Aufruf erfolgt in der Form
transl(Eingabedatei, Ausgabedatei).
also analog zum vordefinierten Pr
dikat 'translate'.
Als Zeichen f
r das Ende der Eingabedatei dient das Zeichen '#';
falls es nicht am Ende der Eingabedatei steht, mu
es von Hand
eingegeben werden.
Der
bersetzer kann Fehlermeldungen produzieren; dabei gibt er
den Namen desjenigen Pr
dikats aus, das den Fehler entdeckt hat,
sowie das fehlerhafte Zeichen und den Rest der Eingabe bis zum
chsten Punkt.
Ist die
bersetzung fehlerfrei verlaufen, so enth
lt die
Ausgabedatei den Zwischencode der neuen Version der
Benutzerschnittstelle; dieser Code kann - am besten nach Entfernen
der Kommentare - mit einem Texteditor anstelle des alten
Zwischencodes in die Systemdatei eingef
gt werden. Es ist ratsam,
vorher eine Kopie der alten (lauff
higen !) Benutzerschnittstelle
zu machen, da es durchaus vorkommen kann, da
die neue Version
fehlerhaft ist. Beliebte Fehler sind das Verwechseln von Gro
- und
Kleinschreibung, insbesondere bei Variablennamen wie z.B.
NextCh - Nextch - NextChar - NextChr etc.
IV.2 Der Editor
Quelltext : 'EDITOR'.
Zwischencode : 'EDITOR.TOY'.
Es handelt sich um einen einfachen Editor f
dikate.
Er wird mit
edit (Name/Stelligkeit).
aufgerufen. Der Editor zeigt jeweils die momentane Klausel
zusammen mit ihrer Nummer an; am Anfang steht er auf Klausel 0,
d.h. vor der ersten Klausel. Nach jedem Kommando wird die (neue)
Klausel angezeigt.
Der Editor versteht folgende Kommandos :
e Name/Stelligkeit ruft eine neue Inkarnation des Editors auf. Es
kann ein anderes Pr
dikat bearbeitet werden.
x verl
t die momentane Inkarnation des Editors.
+ zeigt die n
chste Klausel an, falls es eine
gibt.
<CR> (Leerzeile) wie +
- zeigt die vorherige Klausel an (falls es eine
gibt).
t geht zur Klausel 0.
b geht zur letzten Klausel.
l listet das gesamte Pr
dikat auf.
d l
scht die momentane Klausel und geht zur
n
chsten (oder zur letzten, falls die vorher
letzte gel
scht wurde).
i In den folgenden Zeilen eingegebene Klauseln
werden nach der momentanen Klausel eingef
'end.' beendet den Einf
gemodus.
f Dateiname Wie 'i', aber die Klauseln werden aus der
angegebenen Datei gelesen.
p ruft eine neue Inkarnation von Prolog auf (!).
Wenn 'stop' ausgef
hrt wird, wird im Editor
fortgefahren. In der verschachtelten
Inkarnation von Prolog sollte 'sysload' nicht
benutzt werden.
Ein eingegebenes Kommando mu
nach dem letzten Zeichen beendet
werden. Wo Leerzeichen angegeben sind, mu
genau eines eingegeben
werden.
IV.3 Der Programmanalysator
Quelltext : 'CALLTREE'
Zwischencode : 'CALLTREE.TOY'
Der Programmstrukturanalysator wird mit
calltree (Name/Stelligkeit).
aufgerufen, um das Pr
dikat mit dem angegebenen Namen und der
angegebenen Stelligkeit zu analysieren. Er erzeugt eine Liste der
Aufrufe, die w
hrend des Programmablaufs als Teilziele betrachtet
werden.
Teilziele werden in der Zeile, in der sie erstmals vorkommen, mit
einer Nummer versehen, auf die bei nochmaligem Auftreten verwiesen
wird.
Die Verschachtelungstiefe wird durch verschieden weite Einr
ckung
der Zeilen angezeigt.
Der Programmstrukturanalysator sollte nicht mit 'Help'
unterbrochen werden und nicht im Testmodus laufen, da w
hrend des
Programmablaufs in den meisten F
llen zyklische Datenstrukturen
erzeugt werden. Solche Datenstrukturen entstehen z.B. auch, wenn
die Terme
X und f(X)
unifiziert werden. Wie man sieht, enth
lt TOY Prolog keinen 'occur
check' : Die Terme werden ohne weiteres unifiziert. Jeder Versuch,
den enstehenden Term auszugeben, f
hrt allerdings in eine endlose
Ausgabeschleife, die zum Absturz des Interpreters f
hrt. Im
Programmanalysator werden solche Strukturen erzeugt, wenn
rekursive Pr
dikate analysiert werden.
V. Die Demonstrationsprogramme
V.1 ALPHA
Quellcode : 'ALPHA'
ALPHA ist ein Beispiel f
r die Entwicklung von interaktiven
Programmen. Nach dem Einlesen wird es mit 'go.' aufgerufen.
ALPHA versteht drei Formen von S
tzen. Nachstehend ein
beispielhafter Dialog (Ausgaben unterstrichen) :
(...)
John is a man.
A man is a person.
Is John a person ?
Is Mary a person ?
I don't know !
(...)
ALPHA liest die S
tze mit einem Pr
dikat ein, das einzelne Zeichen
liest und sie zu Worten zusammenfa
t. Die dabei entstehende Liste
von Worten wird danach mit Hilfe von grammatischen Regeln
untersucht und in Prolog-Anweisungen
bersetzt. Die obigen
Eingaben f
hren z.B. dazu, da
folgende Klauseln in die Datenbank
bernommen werden :
man(john).
person(X) :- man(X).
V.2 TOYSEQUEL (
1983 Kluzniak & Szpakowicz)
Quelltext : 'TOYSEQ'
TOYSEQUEL ist ein erheblich gr
eres Beispiel f
r die Benutzung
von grammatikalischen Regeln zur Implementierung einer
Kommandosprache. TOYSEQUEL stellt eine relationale Datenbank dar.
Eine genaue Beschreibung der Kommandos findet sich in "Prolog for
Programmers".
Hier kann nur auf die Grundlagen eingegangen werden, und zwar
anhand von Beispielen :
Aufruf von TOYSEQUEL
:- toysequel.
Es werden einige Relationen erzeugt
create ANG < string name, integer gehalt, integer abtnr >.
create ABT < integer abtnr, string manager >.
create Aufsichtsrat < string name, integer funktion >.
gen von Datentupeln
into ANG insert <"Schmidt", 1000, 1>, <"Meier", 1200, 2>,
<"M
ller", 600, 1>.
into ABT insert <1, "Raffke">, <2, "Hoffmann">.
Anfragen
ber Relationen
relations.
Aufsichtsrat
relation ANG.
string name
integer gehalt
integer abtnr
Betrachten von Tupeln mit bestimmten Eigenschaften
select from ANG tuples <name, gehalt> where abtnr = 1.
Schmidt 1000
ller 600
gen von ausgew
hlten Tupeln
into ANG insert select from ABT tuples <manager, 1000, abtnr>.
ndern von Tupeln
update ANG so that gehalt = 1200 where name = "Raffke".
from ANG delete tuples where name = "Hoffmann".
Die M
glichkeiten des Programms gehen noch erheblich weiter; es
gibt verschiedene M
glichkeiten des Vergleichs, beliebig
komplizierte arithmetische Ausdr
cke; kommt ein Name in mehreren
Relationen vor, so kann er durch Qualifizieren eindeutig bestimmt
werden; eine Relation, die in einem Kommando mehrfach gebraucht
wird, kann 'Alias'-Namen erhalten etc.
Noch drei wichtige Kommandos :
dump to DATEINAME.
speichert die Relationen in der angegebenen Datei.
load from DATEINAME.
dt eine Datei.
stop.
kehrt zur
ck zu TOY Prolog.
V.3 Tic Tac Toe
Quelltext : 'TICTAC.TOE'
Zwischencode : 'TICTAC.TOY'
Tic Tac Toe soll die Verwendung der Grafikfunktionen von TOY
Prolog ST anhand eines Bei - Spiels demonstrieren.
Der Aufruf erfolgt durch
tictactoe.
Der Benutzer spielt gegen den Computer (das Programm ist etwas
langweilig, da der Computer nicht verlieren kann).
Ein Zug wird ausgef
hrt, indem der Benutzer mit dem Mauszeiger auf
ein freies Feld des Spielbrettes zeigt und den linken Mausknopf
Wird der Mausknopf gedr
ckt, w
hrend der Zeiger auf den 'STOP'-
Knopf zeigt, so wird das Programm beendet.
Ende der allgemeinen Dokumemtation zu TOY Prolog ST, Version 3.